home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 2 / AACD 2.iso / AACD / Programming / fpc / amigaunits / lowlevel.pas < prev    next >
Pascal/Delphi Source File  |  1998-09-22  |  12KB  |  447 lines

  1. {
  2.     This file is part of the Free Pascal run time library.
  3.  
  4.     A file in Amiga system run time library.
  5.     Copyright (c) 1998 by Nils Sjoholm
  6.     member of the Amiga RTL development team.
  7.  
  8.     See the file COPYING.FPC, included in this distribution,
  9.     for details about the copyright.
  10.  
  11.     This program is distributed in the hope that it will be useful,
  12.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  14.  
  15.  **********************************************************************}
  16.  
  17. UNIT lowlevel;
  18.  
  19. INTERFACE
  20. USES exec, utility, timer;
  21.  
  22. Type
  23. { structure for use with QueryKeys() }
  24.  pKeyQuery = ^tKeyQuery;
  25.  tKeyQuery = record
  26.     kq_KeyCode  : WORD;
  27.     kq_Pressed  : Boolean;
  28.  end;
  29.  
  30. {***************************************************************************}
  31.  
  32. Const
  33. { bits in the return value of GetKey() }
  34.  LLKB_LSHIFT     = 16;
  35.  LLKB_RSHIFT     = 17;
  36.  LLKB_CAPSLOCK   = 18;
  37.  LLKB_CONTROL    = 19;
  38.  LLKB_LALT       = 20;
  39.  LLKB_RALT       = 21;
  40.  LLKB_LAMIGA     = 22;
  41.  LLKB_RAMIGA     = 23;
  42.  
  43.  LLKF_LSHIFT     = 65536;
  44.  LLKF_RSHIFT     = 131072;
  45.  LLKF_CAPSLOCK   = 262144;
  46.  LLKF_CONTROL    = 524288;
  47.  LLKF_LALT       = 1048576;
  48.  LLKF_RALT       = 2097152;
  49.  LLKF_LAMIGA     = 4194304;
  50.  LLKF_RAMIGA     = 8388608;
  51.  
  52. {***************************************************************************}
  53.  
  54.  
  55. { Tags for SetJoyPortAttrs() }
  56.  SJA_Dummy        = (TAG_USER+$c00100);
  57.  SJA_Type         = (SJA_Dummy+1); { force type to mouse, joy, game cntrlr }
  58.  SJA_Reinitialize = (SJA_Dummy+2); { free potgo bits, reset to autosense   }
  59.  
  60. { Controller types for SJA_Type tag }
  61.  SJA_TYPE_AUTOSENSE = 0;
  62.  SJA_TYPE_GAMECTLR  = 1;
  63.  SJA_TYPE_MOUSE     = 2;
  64.  SJA_TYPE_JOYSTK    = 3;
  65.  
  66.  
  67. {***************************************************************************}
  68.  
  69.  
  70. { ReadJoyPort() return value definitions }
  71.  
  72. { Port types }
  73.  JP_TYPE_NOTAVAIL  = 0;          { port data unavailable    }
  74.  JP_TYPE_GAMECTLR  = 268435456;  { port has game controller }
  75.  JP_TYPE_MOUSE     = 536870912;  { port has mouse           }
  76.  JP_TYPE_JOYSTK    = 805306368;  { port has joystick        }
  77.  JP_TYPE_UNKNOWN   = 1073741824; { port has unknown device  }
  78.  JP_TYPE_MASK      = -268435456; { controller type          }
  79.  
  80. { Button types, valid for all types except JP_TYPE_NOTAVAIL }
  81.  JPB_BUTTON_BLUE    = 23;     { Blue - Stop; Right Mouse                }
  82.  JPB_BUTTON_RED     = 22;     { Red - Select; Left Mouse; Joystick Fire }
  83.  JPB_BUTTON_YELLOW  = 21;     { Yellow - Repeat                         }
  84.  JPB_BUTTON_GREEN   = 20;     { Green - Shuffle                         }
  85.  JPB_BUTTON_FORWARD = 19;     { Charcoal - Forward              }
  86.  JPB_BUTTON_REVERSE = 18;     { Charcoal - Reverse              }
  87.  JPB_BUTTON_PLAY    = 17;     { Grey - Play/Pause; Middle Mouse         }
  88.  JPF_BUTTON_BLUE    = 8388608;
  89.  JPF_BUTTON_RED     = 4194304;
  90.  JPF_BUTTON_YELLOW  = 2097152;
  91.  JPF_BUTTON_GREEN   = 1048576;
  92.  JPF_BUTTON_FORWARD = 524288;
  93.  JPF_BUTTON_REVERSE = 262144;
  94.  JPF_BUTTON_PLAY    = 131072;
  95.  JP_BUTTON_MASK     = JPF_BUTTON_BLUE OR JPF_BUTTON_RED OR JPF_BUTTON_YELLOW OR JPF_BUTTON_GREEN OR JPF_BUTTON_FORWARD OR JPF_BUTTON_REVERSE OR JPF_BUTTON_PLAY;
  96.  
  97. { Direction types, valid for JP_TYPE_GAMECTLR and JP_TYPE_JOYSTK }
  98.  JPB_JOY_UP        = 3;
  99.  JPB_JOY_DOWN      = 2;
  100.  JPB_JOY_LEFT      = 1;
  101.  JPB_JOY_RIGHT     = 0;
  102.  JPF_JOY_UP        = 8;
  103.  JPF_JOY_DOWN      = 4;
  104.  JPF_JOY_LEFT      = 2;
  105.  JPF_JOY_RIGHT     = 1;
  106.  JP_DIRECTION_MASK = JPF_JOY_UP OR JPF_JOY_DOWN OR JPF_JOY_LEFT OR JPF_JOY_RIGHT;
  107.  
  108. { Mouse position reports, valid for JP_TYPE_MOUSE }
  109.  JP_MHORZ_MASK     = 255;        { horzizontal position }
  110.  JP_MVERT_MASK     = 65280;      { vertical position    }
  111.  JP_MOUSE_MASK     = JP_MHORZ_MASK OR JP_MVERT_MASK;
  112.  
  113. { Obsolete ReadJoyPort() definitions, here for source code compatibility only.
  114.  * Please do NOT use in new code.
  115.  }
  116.  JPB_BTN1  = JPB_BUTTON_BLUE   ;
  117.  JPF_BTN1  = JPF_BUTTON_BLUE   ;
  118.  JPB_BTN2  = JPB_BUTTON_RED    ;
  119.  JPF_BTN2  = JPF_BUTTON_RED    ;
  120.  JPB_BTN3  = JPB_BUTTON_YELLOW ;
  121.  JPF_BTN3  = JPF_BUTTON_YELLOW ;
  122.  JPB_BTN4  = JPB_BUTTON_GREEN  ;
  123.  JPF_BTN4  = JPF_BUTTON_GREEN  ;
  124.  JPB_BTN5  = JPB_BUTTON_FORWARD;
  125.  JPF_BTN5  = JPF_BUTTON_FORWARD;
  126.  JPB_BTN6  = JPB_BUTTON_REVERSE;
  127.  JPF_BTN6  = JPF_BUTTON_REVERSE;
  128.  JPB_BTN7  = JPB_BUTTON_PLAY   ;
  129.  JPF_BTN7  = JPF_BUTTON_PLAY   ;
  130.  JPB_UP    = JPB_JOY_UP        ;
  131.  JPF_UP    = JPF_JOY_UP        ;
  132.  JPB_DOWN  = JPB_JOY_DOWN      ;
  133.  JPF_DOWN  = JPF_JOY_DOWN      ;
  134.  JPB_LEFT  = JPB_JOY_LEFT      ;
  135.  JPF_LEFT  = JPF_JOY_LEFT      ;
  136.  JPB_RIGHT = JPB_JOY_RIGHT     ;
  137.  JPF_RIGHT = JPF_JOY_RIGHT     ;
  138.  
  139.  
  140. {***************************************************************************}
  141.  
  142.  
  143. { Tags for SystemControl() }
  144.  SCON_Dummy         = (TAG_USER+$00C00000);
  145.  SCON_TakeOverSys   = (SCON_Dummy+0);
  146.  SCON_KillReq       = (SCON_Dummy+1);
  147.  SCON_CDReboot      = (SCON_Dummy+2);
  148.  SCON_StopInput     = (SCON_Dummy+3);
  149.  SCON_AddCreateKeys = (SCON_Dummy+4);
  150.  SCON_RemCreateKeys = (SCON_Dummy+5);
  151.  
  152. { Reboot control values for use with SCON_CDReboot tag }
  153.  CDReboot_On        =     1;
  154.  CDReboot_Off       =     0;
  155.  CDReboot_Default   =     2;
  156.  
  157.  
  158. {***************************************************************************}
  159.  
  160.  
  161. { Rawkey codes returned when using SCON_AddCreateKeys with SystemControl() }
  162.  
  163.  RAWKEY_PORT0_BUTTON_BLUE      =  $72;
  164.  RAWKEY_PORT0_BUTTON_RED       =  $78;
  165.  RAWKEY_PORT0_BUTTON_YELLOW    =  $77;
  166.  RAWKEY_PORT0_BUTTON_GREEN     =  $76;
  167.  RAWKEY_PORT0_BUTTON_FORWARD   =  $75;
  168.  RAWKEY_PORT0_BUTTON_REVERSE   =  $74;
  169.  RAWKEY_PORT0_BUTTON_PLAY      =  $73;
  170.  RAWKEY_PORT0_JOY_UP           =  $79;
  171.  RAWKEY_PORT0_JOY_DOWN         =  $7A;
  172.  RAWKEY_PORT0_JOY_LEFT         =  $7C;
  173.  RAWKEY_PORT0_JOY_RIGHT        =  $7B;
  174.  
  175.  RAWKEY_PORT1_BUTTON_BLUE      =  $172;
  176.  RAWKEY_PORT1_BUTTON_RED       =  $178;
  177.  RAWKEY_PORT1_BUTTON_YELLOW    =  $177;
  178.  RAWKEY_PORT1_BUTTON_GREEN     =  $176;
  179.  RAWKEY_PORT1_BUTTON_FORWARD   =  $175;
  180.  RAWKEY_PORT1_BUTTON_REVERSE   =  $174;
  181.  RAWKEY_PORT1_BUTTON_PLAY      =  $173;
  182.  RAWKEY_PORT1_JOY_UP           =  $179;
  183.  RAWKEY_PORT1_JOY_DOWN         =  $17A;
  184.  RAWKEY_PORT1_JOY_LEFT         =  $17C;
  185.  RAWKEY_PORT1_JOY_RIGHT        =  $17B;
  186.  
  187.  RAWKEY_PORT2_BUTTON_BLUE      =  $272;
  188.  RAWKEY_PORT2_BUTTON_RED       =  $278;
  189.  RAWKEY_PORT2_BUTTON_YELLOW    =  $277;
  190.  RAWKEY_PORT2_BUTTON_GREEN     =  $276;
  191.  RAWKEY_PORT2_BUTTON_FORWARD   =  $275;
  192.  RAWKEY_PORT2_BUTTON_REVERSE   =  $274;
  193.  RAWKEY_PORT2_BUTTON_PLAY      =  $273;
  194.  RAWKEY_PORT2_JOY_UP           =  $279;
  195.  RAWKEY_PORT2_JOY_DOWN         =  $27A;
  196.  RAWKEY_PORT2_JOY_LEFT         =  $27C;
  197.  RAWKEY_PORT2_JOY_RIGHT        =  $27B;
  198.  
  199.  RAWKEY_PORT3_BUTTON_BLUE      =  $372;
  200.  RAWKEY_PORT3_BUTTON_RED       =  $378;
  201.  RAWKEY_PORT3_BUTTON_YELLOW    =  $377;
  202.  RAWKEY_PORT3_BUTTON_GREEN     =  $376;
  203.  RAWKEY_PORT3_BUTTON_FORWARD   =  $375;
  204.  RAWKEY_PORT3_BUTTON_REVERSE   =  $374;
  205.  RAWKEY_PORT3_BUTTON_PLAY      =  $373;
  206.  RAWKEY_PORT3_JOY_UP           =  $379;
  207.  RAWKEY_PORT3_JOY_DOWN         =  $37A;
  208.  RAWKEY_PORT3_JOY_LEFT         =  $37C;
  209.  RAWKEY_PORT3_JOY_RIGHT        =  $37B;
  210.  
  211.  
  212. {***************************************************************************}
  213.  
  214.  
  215. { Return values for GetLanguageSelection() }
  216.  LANG_UNKNOWN    = 0 ;
  217.  LANG_AMERICAN   = 1 ;      { American English }
  218.  LANG_ENGLISH    = 2 ;      { British English  }
  219.  LANG_GERMAN     = 3 ;
  220.  LANG_FRENCH     = 4 ;
  221.  LANG_SPANISH    = 5 ;
  222.  LANG_ITALIAN    = 6 ;
  223.  LANG_PORTUGUESE = 7 ;
  224.  LANG_DANISH     = 8 ;
  225.  LANG_DUTCH      = 9 ;
  226.  LANG_NORWEGIAN  = 10;
  227.  LANG_FINNISH    = 11;
  228.  LANG_SWEDISH    = 12;
  229.  LANG_JAPANESE   = 13;
  230.  LANG_CHINESE    = 14;
  231.  LANG_ARABIC     = 15;
  232.  LANG_GREEK      = 16;
  233.  LANG_HEBREW     = 17;
  234.  LANG_KOREAN     = 18;
  235.  
  236.  
  237. {***************************************************************************}
  238.  
  239.  
  240. { --- functions in V40 or higher (Release 3.1) --- }
  241.  
  242. VAR LowLevelBase : pLibrary;
  243.  
  244. FUNCTION AddKBInt(intRoutine : POINTER; intData : POINTER) : POINTER;
  245. FUNCTION AddTimerInt(intRoutine : POINTER; intData : POINTER) : POINTER;
  246. FUNCTION AddVBlankInt(intRoutine : POINTER; intData : POINTER) : POINTER;
  247. FUNCTION ElapsedTime(context : pEClockVal) : ULONG;
  248. FUNCTION GetKey : ULONG;
  249. FUNCTION GetLanguageSelection : BYTE;
  250. PROCEDURE QueryKeys(queryArray : pKeyQuery; arraySize : ULONG);
  251. FUNCTION ReadJoyPort(port : ULONG) : ULONG;
  252. PROCEDURE RemKBInt(intHandle : POINTER);
  253. PROCEDURE RemTimerInt(intHandle : POINTER);
  254. PROCEDURE RemVBlankInt(intHandle : POINTER);
  255. FUNCTION SetJoyPortAttrsA(portNumber : ULONG; tagList : pTagItem) : BOOLEAN;
  256. PROCEDURE StartTimerInt(intHandle : POINTER; timeInterval : ULONG; continuous : LONGINT);
  257. PROCEDURE StopTimerInt(intHandle : POINTER);
  258. FUNCTION SystemControlA(tagList : pTagItem) : ULONG;
  259.  
  260. IMPLEMENTATION
  261.  
  262. FUNCTION AddKBInt(intRoutine : POINTER; intData : POINTER) : POINTER;
  263. BEGIN
  264.   ASM
  265.     MOVE.L  A6,-(A7)
  266.     MOVEA.L intRoutine,A0
  267.     MOVEA.L intData,A1
  268.     MOVEA.L LowLevelBase,A6
  269.     JSR -060(A6)
  270.     MOVEA.L (A7)+,A6
  271.     MOVE.L  D0,@RESULT
  272.   END;
  273. END;
  274.  
  275. FUNCTION AddTimerInt(intRoutine : POINTER; intData : POINTER) : POINTER;
  276. BEGIN
  277.   ASM
  278.     MOVE.L  A6,-(A7)
  279.     MOVEA.L intRoutine,A0
  280.     MOVEA.L intData,A1
  281.     MOVEA.L LowLevelBase,A6
  282.     JSR -078(A6)
  283.     MOVEA.L (A7)+,A6
  284.     MOVE.L  D0,@RESULT
  285.   END;
  286. END;
  287.  
  288. FUNCTION AddVBlankInt(intRoutine : POINTER; intData : POINTER) : POINTER;
  289. BEGIN
  290.   ASM
  291.     MOVE.L  A6,-(A7)
  292.     MOVEA.L intRoutine,A0
  293.     MOVEA.L intData,A1
  294.     MOVEA.L LowLevelBase,A6
  295.     JSR -108(A6)
  296.     MOVEA.L (A7)+,A6
  297.     MOVE.L  D0,@RESULT
  298.   END;
  299. END;
  300.  
  301. FUNCTION ElapsedTime(context : pEClockVal) : ULONG;
  302. BEGIN
  303.   ASM
  304.     MOVE.L  A6,-(A7)
  305.     MOVEA.L context,A0
  306.     MOVEA.L LowLevelBase,A6
  307.     JSR -102(A6)
  308.     MOVEA.L (A7)+,A6
  309.     MOVE.L  D0,@RESULT
  310.   END;
  311. END;
  312.  
  313. FUNCTION GetKey : ULONG;
  314. BEGIN
  315.   ASM
  316.     MOVE.L  A6,-(A7)
  317.     MOVEA.L LowLevelBase,A6
  318.     JSR -048(A6)
  319.     MOVEA.L (A7)+,A6
  320.     MOVE.L  D0,@RESULT
  321.   END;
  322. END;
  323.  
  324. FUNCTION GetLanguageSelection : BYTE;
  325. BEGIN
  326.   ASM
  327.     MOVE.L  A6,-(A7)
  328.     MOVEA.L LowLevelBase,A6
  329.     JSR -036(A6)
  330.     MOVEA.L (A7)+,A6
  331.     MOVE.L  D0,@RESULT
  332.   END;
  333. END;
  334.  
  335. PROCEDURE QueryKeys(queryArray : pKeyQuery; arraySize : ULONG);
  336. BEGIN
  337.   ASM
  338.     MOVE.L  A6,-(A7)
  339.     MOVEA.L queryArray,A0
  340.     MOVE.L  arraySize,D1
  341.     MOVEA.L LowLevelBase,A6
  342.     JSR -054(A6)
  343.     MOVEA.L (A7)+,A6
  344.   END;
  345. END;
  346.  
  347. FUNCTION ReadJoyPort(port : ULONG) : ULONG;
  348. BEGIN
  349.   ASM
  350.     MOVE.L  A6,-(A7)
  351.     MOVE.L  port,D0
  352.     MOVEA.L LowLevelBase,A6
  353.     JSR -030(A6)
  354.     MOVEA.L (A7)+,A6
  355.     MOVE.L  D0,@RESULT
  356.   END;
  357. END;
  358.  
  359. PROCEDURE RemKBInt(intHandle : POINTER);
  360. BEGIN
  361.   ASM
  362.     MOVE.L  A6,-(A7)
  363.     MOVEA.L intHandle,A1
  364.     MOVEA.L LowLevelBase,A6
  365.     JSR -066(A6)
  366.     MOVEA.L (A7)+,A6
  367.   END;
  368. END;
  369.  
  370. PROCEDURE RemTimerInt(intHandle : POINTER);
  371. BEGIN
  372.   ASM
  373.     MOVE.L  A6,-(A7)
  374.     MOVEA.L intHandle,A1
  375.     MOVEA.L LowLevelBase,A6
  376.     JSR -084(A6)
  377.     MOVEA.L (A7)+,A6
  378.   END;
  379. END;
  380.  
  381. PROCEDURE RemVBlankInt(intHandle : POINTER);
  382. BEGIN
  383.   ASM
  384.     MOVE.L  A6,-(A7)
  385.     MOVEA.L intHandle,A1
  386.     MOVEA.L LowLevelBase,A6
  387.     JSR -114(A6)
  388.     MOVEA.L (A7)+,A6
  389.   END;
  390. END;
  391.  
  392. FUNCTION SetJoyPortAttrsA(portNumber : ULONG; tagList : pTagItem) : BOOLEAN;
  393. BEGIN
  394.   ASM
  395.     MOVE.L  A6,-(A7)
  396.     MOVE.L  portNumber,D0
  397.     MOVEA.L tagList,A1
  398.     MOVEA.L LowLevelBase,A6
  399.     JSR -132(A6)
  400.     MOVEA.L (A7)+,A6
  401.     TST.W   D0
  402.     BEQ.B   @end
  403.     MOVEQ   #1,D0
  404.   @end: MOVE.B  D0,@RESULT
  405.   END;
  406. END;
  407.  
  408. PROCEDURE StartTimerInt(intHandle : POINTER; timeInterval : ULONG; continuous : LONGINT);
  409. BEGIN
  410.   ASM
  411.     MOVE.L  A6,-(A7)
  412.     MOVEA.L intHandle,A1
  413.     MOVE.L  timeInterval,D0
  414.     MOVE.L  continuous,D1
  415.     MOVEA.L LowLevelBase,A6
  416.     JSR -096(A6)
  417.     MOVEA.L (A7)+,A6
  418.   END;
  419. END;
  420.  
  421. PROCEDURE StopTimerInt(intHandle : POINTER);
  422. BEGIN
  423.   ASM
  424.     MOVE.L  A6,-(A7)
  425.     MOVEA.L intHandle,A1
  426.     MOVEA.L LowLevelBase,A6
  427.     JSR -090(A6)
  428.     MOVEA.L (A7)+,A6
  429.   END;
  430. END;
  431.  
  432. FUNCTION SystemControlA(tagList : pTagItem) : ULONG;
  433. BEGIN
  434.   ASM
  435.     MOVE.L  A6,-(A7)
  436.     MOVEA.L tagList,A1
  437.     MOVEA.L LowLevelBase,A6
  438.     JSR -072(A6)
  439.     MOVEA.L (A7)+,A6
  440.     MOVE.L  D0,@RESULT
  441.   END;
  442. END;
  443.  
  444. END. (* UNIT LOWLEVEL *)
  445.  
  446.  
  447.